/*******************************************************************************
 *
 * File:        KEYMAN.c
 * Progetto:    Robottino
 * Ambiente:    PIC32
 * Data:        19/03/2012
 * Autore:      M. Tili
 * Versione:    00.00
 *
 * Descrizione: 
 *   Modulo di controllo dei BOTTONI.
 *
 *
 * Modifica:  gg/mm/aaaa  | N.Cognome
 *                        | Descrizione modifica
 *
 */
#include "CONFIG.h"
#include "TYPEDEFS.h"
#include "GLOBVAR.h"
#include "TIMER.h"
#include "KEYMAN.h"


/*___DEFINIZIONE TIPI E VARIABILI PRIVATE_____________________________________*/

typedef enum {
  KEY_OFF    = 0,
  KEY_OFF_ON = 1,
  KEY_ON_OFF = 2,
  KEY_ON     = 3
} e_key_msf;
 

static e_key_msf keyStat[KEY_ID_MAX] = {
  KEY_OFF,
  KEY_OFF,
  KEY_OFF,
  KEY_OFF
};


/*___DEFINIZIONE FUNZIONI PRIVATE_____________________________________________*/

static KeyManUpdtOneKey(e_key_id keyIDX, e_timer_id tmrTrans, e_led_id ledIDX);
static KeyManBlinkLed(e_key_id keyIDX, e_timer_id tmrTrans, e_led_id ledIDX);

/*___FINE DELLE DEFINIZIONI___________________________________________________*/
/*============================================================================*/



/*******************************************************************************
 *
 *  KeyManInit
 *  Descrizione: Questa funzione inizializza i dati del modulo KEYMAN ed i timer
 *               associati.
 *
 */
void KeyManInit(void)
{
  int idx;
  for(idx=0;idx <KEY_ID_MAX;idx++)
  {
    keyStat[idx]=KEY_OFF;
  }
  TimerResetById(TIMER_KEY00_TRANS);
  TimerResetById(TIMER_KEY01_TRANS);
  TimerResetById(TIMER_KEY02_TRANS);
}



/*******************************************************************************
 *
 *  KeyManUpdate
 *  Descrizione: Questa funzione schedula l'aggiornamento dello stato dei 
 *               comandi sui BOTTONI.
 *
 */
void KeyManUpdate(void)
{
  KeyManUpdtOneKey(KEY_ID_00, TIMER_KEY00_TRANS, LED_ID_00);
  KeyManUpdtOneKey(KEY_ID_01, TIMER_KEY01_TRANS, LED_ID_01);
  //KeyManUpdtOneKey(KEY_ID_02, TIMER_KEY02_TRANS, LED_ID_02);
  KeyManBlinkLed(KEY_ID_02, TIMER_KEY02_TRANS, LED_ID_02);
}



/*******************************************************************************
 *
 *  KeyManUpdtOneKey
 *  Descrizione: Questa funzione comanda l'accensione o lo spegnimento di un LED
 *               in accordo alla stato di un BOTTONE.
 *
 */
static KeyManUpdtOneKey(e_key_id keyIDX, e_timer_id tmrTrans, e_led_id ledIDX)
{
  switch (keyStat[keyIDX])
  {
    case KEY_OFF:
      LedManSetCmd(ledIDX,LED_CMD_OFF);
      if (ioDataStat.input[keyIDX] == STATE_HIGH)
      {
        TimerSet(TIMER_KEY00_TRANS,200,FALSE);
        keyStat[keyIDX] = KEY_OFF_ON;
      }
      break;
    case KEY_OFF_ON:
      if (TimerHasExpired(TIMER_KEY00_TRANS) == TRUE)
      {
        TimerResetById(TIMER_KEY00_TRANS);
        if (ioDataStat.input[keyIDX] == STATE_HIGH)
        {
          keyStat[keyIDX] = KEY_ON;
        }
        else
        {
          keyStat[keyIDX] = KEY_OFF;
        }
      }
      break;
    case KEY_ON_OFF:
      if (TimerHasExpired(TIMER_KEY00_TRANS) == TRUE)
      {
        TimerResetById(TIMER_KEY00_TRANS);
        if (ioDataStat.input[keyIDX] == STATE_LOW)
        {
          keyStat[keyIDX] = KEY_OFF;
        }
        else
        {
          keyStat[keyIDX] = KEY_ON;
        }
      }
      break;
    case KEY_ON:
      LedManSetCmd(ledIDX,LED_CMD_ON);
      if (ioDataStat.input[keyIDX] == STATE_LOW)
      {
        TimerSet(TIMER_KEY00_TRANS,200,FALSE);
        keyStat[keyIDX] = KEY_ON_OFF;
      }
      break;
    default:
      break;
  }
}


/*******************************************************************************
 *
 *  KeyManBlinkLed
 *  Descrizione: Questa funzione comanda il lampeggio (BLINK) di un LED
 *               in accordo alla stato di un BOTTONE.
 *
 */
static KeyManBlinkLed(e_key_id keyIDX, e_timer_id tmrTrans, e_led_id ledIDX)
{
  switch (keyStat[keyIDX])
  {
    case KEY_OFF:
      if (ioDataStat.input[keyIDX] == STATE_HIGH)
      {
        TimerSet(TIMER_KEY00_TRANS,200,FALSE);
        keyStat[keyIDX] = KEY_OFF_ON;
      }
      break;
    case KEY_OFF_ON:
      if (TimerHasExpired(TIMER_KEY00_TRANS) == TRUE)
      {
        TimerResetById(TIMER_KEY00_TRANS);
        if (ioDataStat.input[keyIDX] == STATE_HIGH)
        {
          keyStat[keyIDX] = KEY_ON;
        }
        else
        {
          keyStat[keyIDX] = KEY_OFF;
        }
      }
      break;
    case KEY_ON_OFF:
      if (TimerHasExpired(TIMER_KEY00_TRANS) == TRUE)
      {
        TimerResetById(TIMER_KEY00_TRANS);
        if (ioDataStat.input[keyIDX] == STATE_LOW)
        {
          keyStat[keyIDX] = KEY_OFF;
        }
        else
        {
          keyStat[keyIDX] = KEY_ON;
        }
      }
      break;
    case KEY_ON:
      LedManSetCmd(ledIDX,LED_CMD_BLINK);
      if (ioDataStat.input[keyIDX] == STATE_LOW)
      {
        TimerSet(TIMER_KEY00_TRANS,200,FALSE);
        keyStat[keyIDX] = KEY_ON_OFF;
      }
      break;
    default:
      break;
  }
}





